package com.atguigu.config;

import com.atguigu.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * @Author:zwy
 * @Despriction: bean的生命周期
 *                  bean创建---初始化--销毁的过程
 *  容器管理了bean的生命周期
 *  我们可以自定义初始化和销毁方法容器在bean进行到当前生命周期的时候来调我们自定义初始化和销毁方法
 *  构造
 *
 *  初始化 对象创建完成并赋值好 调用初始化方法
 *  多实例阿bean不会管理bean 所以不会调用销毁方法
 *
 *  1)指定bean初始化和销毁方法
 *  2)通过让bean实现InitializingBean接口(定义初始化逻辑)
 *  3)通过让bean实现IDisposableBean
 *  4)使用JSR250:
 *      @PostConstruct 在bean创建完成 并且属性赋值完成 来执行初始化
 *      @PreDestroy 在容器销毁之前bean 通知销毁工作
 *
 *
 *   5)BeanPostProcessor
 *       postProcessBeforeInitialization() 在初始化之前
 *       postProcessAfterInitialization() 在初始化之后
 *      遍历得到容器所有的BeanPostProcessor 挨个执行eforeInitbialization
 *       wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
 *      invokeInitMethods(beanName, wrappedBean, mbd);
 *      wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
 *
}
 *
 *     Spring底层对BeanPostprocessor
 *
 *
 * @Date:Create in 15:48 2018/7/7
 * @Modify By:
 */
@Configuration
@ComponentScan("com.atguigu")
public class MyConfigOfLifeCycle {
    @Bean(initMethod = "init",destroyMethod = "destory")
    public Car car(){
        return new Car();
    }
}
